home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Belgian Amiga Club - ADF Collection
/
BS1 part 26.zip
/
BS1 part 26
/
AMOS compiler.adf
/
Files
/
Compiler.AMOS
/
Compiler.amosSourceCode
< prev
next >
Wrap
AMOS Source Code
|
1991-06-13
|
21KB
|
805 lines
'----------------------------------
' AMOS Compiler shell accessory
'
' By Fran�ois Lionet
' (c) Europress Software Ltd. 1991
'----------------------------------
'
Global PATH$,DPATH$,PRAM$,CNAME$,FLAG$,FACC,CFLASH$
'
CNAME$="Compiler_Configuration"
PRAM$="RAM:AMOS_Compiler_Temp"
DPATH$=":AMOS_System"
'
' Colour to flash when un-squashing compiled programs. >31 for no flash
' Read Welcome text file for more infos...
CFLASH$="-Z32"
'
' Enough RAM?
Close Workbench
Close Editor
Set Sprite Buffer 48
If Chip Free+Fast Free<80*1024
Screen Open 0,640,24,2,Hires : Colour 1,$FFF : Curs Off
Centre ">>> Sorry, the compiler needs at least 80 Kbytes free to run. <<<"
Print : Print : Centre "Press any key"
Wait Key : Edit
End If
'
' Get the directories
On Error Proc _NO_DISC
If Exist(PRAM$+"/"+CNAME$)
DPATH$=PRAM$
Open In 1,PRAM$+"/Compiler_Origin"
Input #1,PATH$
Close
End If
'
Break Off
Change Mouse 4+6
_UNPACK_FADE[10,0,2]
_UNPACK_ICONS
_UNPACK_INFO
_LOAD_CONFIGURATION
_SET_ZONES
For B=1 To 3
_ANIMATE_BUTTON[B,0]
Next
NOINFO
_RESET_COMPILE
'
' Load ACmp program
On Error Proc _FATAL_DISC_ERROR
If Not Extension_5_00AE
INFO['>>> Loading "ACmp" program <<<']
If PATH$<>""
Extension_5_0098 PATH$+"/ACmp"
Else
Extension_5_0098 DPATH$+"/ACmp"
End If
NOINFO
End If
'
' Copy into ram-disc?
_GETFLAG[5]
If Param
If Exist("Ram:")
If DPATH$<>PRAM$
_COPY_FOLDER[DPATH$,PRAM$]
If Param
PATH$=Dir$ : C=Instr(PATH$,":") : PATH$=Left$(PATH$,C-1)+DPATH$
Open Out 1,PRAM$+"/Compiler_Origin"
Print #1,PATH$
Close
DPATH$=PRAM$
End If
End If
End If
End If
'
' Menu loop
Do
Repeat
Multi Wait
Z=Mouse Zone
If Mouse Key=2
INFO[">>>"+Str$(Chip Free+Fast Free+17000)+" bytes free to compile. <<<"]
While Mouse Key=2 : Wend
NOINFO
Wait 16
End If
Until Z<>0 and Mouse Key=1
_ANIMATE_BUTTON[Z,-1]
While Mouse Key : Wend
If Z=4 : _COMPILE : End If
If Z=5 : _THEEND : End If
Loop
'
Procedure _COMPILE
'
On Error Proc _GENERAL_DISC_ERROR
Resume Label _FINISH_COMPILE
'
_INIT_COMPILE
Screen Close 1
'
Do
_GETFLAG[1] : C$=" -D"+Mid$(Str$(Param),2)
S$=Fsel$("*.AMOS","","Please choose program to compile.","QUIT to abort compilation.")
If S$="" : INFO[">>> Compilation cancelled. <<<"] : KWAIT : Goto _FINISH_COMPILE : End If
'
_GETFLAG[2] : C$=C$+Mid$(Str$(Param),2)
D$=Fsel$("**","","Please choose destination file name.",'"OK" for default name.')
If D$=""
_GETFLAG[3]
If Upper$(Right$(S$,5))=".AMOS"
If Param<2
D$=Left$(S$,Len(S$)-5)
Else
D$=Left$(S$,Len(S$)-5)+"_C.AMOS"
End If
End If
End If
Exit If D$<>""
INFO[">>> Please choose a .AMOS program, or enter object name. <<<"]
KWAIT : NOINFO
Loop
'
_GETFLAG[3] : TYPE=Param : If TYPE=2 : TYPE=3 : End If
'
C$='"'+S$+'"'+C$+" -O"+'"'+D$+'"'
_GETFLAG[10] : C$=C$+" -S"+Mid$(Str$(Param),2)
_GETFLAG[9] : C$=C$+" -E"+Mid$(Str$(Param),2)
_GETFLAG[8] : C$=C$+" -W"+Mid$(Str$(Param),2)
_GETFLAG[4] : If TYPE=1 : Add TYPE,1 : End If
_GETFLAG[12] : If Param : C$=C$+" -L" : End If
C$=C$+" -T"+Mid$(Str$(TYPE),2)
C$=C$+" -F"+DPATH$+"/"+" -C"+DPATH$+"/"+CNAME$
C$=C$+" "+CFLASH$
'
Timer=0 : Extension_5_006E C$,$12345678 : E$= Extension_5_0078
T=Timer/50 : M=T/60 : S=T mod 60
'
If E$=""
SZ= Extension_5_00BE
A$="Object size:"+Str$(SZ)+" bytes -"+Str$( Extension_5_00BE )+" instructions - Compiled in"
If M : A$=A$+Str$(M)+" M." : End If
A$=A$+Str$(S)+" Second" : If S>1 : A$=A$+"s" : End If
A$=A$+"."
INFO[A$]
_GETFLAG[11]
If Param<>0 and TYPE<>3
KWAIT
INFO[">>> Squashing program. Press CONTROL-C to cancel squashing <<<"]
DD$=D$+"_Temp"
_SQUASH_A_PROG[D$,DD$,1]
If Param>0
A$=">>> Successfull squash, final size:"+Str$(Param)+","+Str$(SZ-Param)+" bytes saved. <<<"
INFO[A$]
Else
If Param=0
INFO[">>> Squash interrupted. <<<"]
End If
If Param<0
INFO[">>> Un-successfull squash, no object file on disc. <<<"]
End If
End If
On Error Proc _SKIP_DISC_ERROR
Resume Label NOKIL1
Kill D$
NOKIL1:
Resume Label NOKIL2
Rename DD$ To D$
NOKIL2:
End If
Else
A$=">>> "+E$+" <<<" : INFO[A$]
End If
KWAIT
'
_FINISH_COMPILE:
_UNPACK_ICONS
_RESET_COMPILE
NOINFO : Screen 0
End Proc
Procedure _NO_DISC
Screen Open 0,640,24,2,Hires : Colour 1,$FFF : Curs Off
Centre "I cannot reach the crucial files from your disc,"
Print : Centre "please read the manual for more informations."
Print : Centre ">>> Press any key <<<"
Wait Key : Edit
End Proc
Procedure _FATAL_DISC_ERROR
INFO[">>> Disc error: AMOS_System MUST be in the CURRENT drive. <<<"]
KWAIT
_THEEND
End Proc
Procedure _GENERAL_DISC_ERROR
Close
INFO[">>> Disc error, check your disc drive and free space on disc. <<<"]
KWAIT
Resume Label
End Proc
Procedure _SKIP_DISC_ERROR
Resume Label
End Proc
Procedure _RESET_COMPILE
LX=72 : Y3=92
Bob Off 1 : Update
Synchro On : Update On
Make Mask 1
For X=0 To 9*23 Step 9
Paste Bob LX+X,Y3,1
Next
Wait Vbl
OX=192 : DX=16
Screen Copy 1,OX,34,OX+72,34+33 To 0,DX,Y3
End Proc
Procedure _INIT_COMPILE
OX=192 : DX=16 : Y3=92 : LX=72
For N=1 To 6 : Make Mask N : Next
Wait Vbl : Screen Copy 1,OX,68,OX+72,68+33 To 0,DX,Y3
Set Bob 1,-1,, : Bob 1,LX,Y3,1
Channel 1 To Bob 1
A$=A$+" Let RA=0; Let RB=0; Let R0=0; Let A=1;"
A$=A$+"Loop: If RA<>RB Jump More;"
A$=A$+" Pause; Jump Loop;"
A$=A$+"More: Let R0=R0+1; If R0=6 Jump Plus;"
A$=A$+" Let A=A+1; Jump Again;"
A$=A$+"Plus: Let R0=0; Let X=X+9; Let A=1;"
A$=A$+"Again:Let RB=RB+1; Pause;"
A$=A$+" Jump Loop;"
Amal 1,A$
Amal On
Wait 5
Synchro Off : Update Off
End Proc
Procedure _LOAD_CONFIGURATION
On Error Proc _SKIP_DISC_ERROR
Resume Label NOLOAD
'
Do
A$=">>> Cannot load configuration file. <<<"
If Exist(DPATH$+"/"+CNAME$)
A$=">>> Configuration file corrupted. <<<"
INFO[">>> Loading "+CNAME$+" <<<"]
Open In 1,DPATH$+"/"+CNAME$ : L=Lof(1) : Close
Erase 9 : Reserve As Work 9,L
Bload DPATH$+"/"+CNAME$,Start(9)
CONF=Hunt(Start(9) To Start(9)+Length(9),"[")+1
If CONF
If Chr$(Peek(CONF+60))="]"
FLAG$=Space$(12)
For C=0 To Len(FLAG$)-1
Poke Varptr(FLAG$)+C,Peek(CONF+C)
Next
FLAG=True
End If
End If
End If
Erase 9
Exit If FLAG
Goto KIPS
'
NOLOAD: A$=">>> Cannot load configuration file. <<<"
KIPS: INFO[A$] : KWAIT : NOINFO
CNAME$=Fsel$("Compiler_Configuratio**","","Please select a configuration to load.","Click on SET DIR before leaving.")
If CNAME$="" : _THEEND : End If
_GET_DISCNAME[CNAME$] : CNAME$=Param$
Loop
NOINFO
End Proc
Procedure _SAVE_CONFIGURATION
On Error Proc _GENERAL_DISC_ERROR
Resume Label _NOSAVE
'
If Exist(DPATH$+"/"+CNAME$)
Open In 1,DPATH$+"/"+CNAME$ : L=Lof(1) : Close
Erase 9 : Reserve As Work 9,L
Bload DPATH$+"/"+CNAME$,Start(9)
CONF=Hunt(Start(9) To Start(9)+Length(9),"[")+1
For C=1 To Len(FLAG$)
Poke CONF,Asc(Mid$(FLAG$,C,1)) : Inc CONF
Next
Bsave DPATH$+"/"+CNAME$,Start(9) To Start(9)+L
If PATH$<>""
Bsave PATH$+"/"+CNAME$,Start(9) To Start(9)+L
End If
Erase 9
FLAG=True
End If
_NOSAVE:
If FLAG=0
INFO[">>> Cannot save configuration file. <<<"]
KWAIT
End If
End Proc
Procedure _GET_DISCNAME[N$]
For N=Len(N$) To 1 Step -1
A$=Mid$(N$,N,1)
Exit If(A$="/") or(A$=":")
Next
N$=Mid$(N$,N+1)
End Proc[N$]
Procedure _GETFLAG[N]
End Proc[Asc(Mid$(FLAG$,N,1))-48]
Procedure _SETFLAG[N,V]
Mid$(FLAG$,N)=Chr$(48+V)
End Proc
Procedure _ANIMATE_BUTTON[Z,FLAG]
'
Shared _ORIGIN,_DEST,_TYPE
Y1=48 : Y2=134
'
On Z Gosub Z1,Z2,Z3,Z4,Z5,Z6,Z7
Pop Proc
'
Z1:
If FLAG
_GETFLAG[1] : _SETFLAG[1,1-Param]
End If
_GETFLAG[1] : OX=Param*64 : DX=16 : Goto ZZ
Z2:
If FLAG
_GETFLAG[2] : _SETFLAG[2,1-Param]
End If
_GETFLAG[2] : OX=Param*64 : DX=128 : Goto ZZ
Z3:
If FLAG
_GETFLAG[3] : F=Param
Add F,1,0 To 2
_SETFLAG[3,F]
End If
_GETFLAG[3] : OX=Param*64+128 : DX=240 : Goto ZZ
Z4: Return
Z5: OX=0 : DX=16 : Goto CB
Z6: OX=64 : DX=128
Wait Vbl : Screen Copy 1,OX,68,OX+64,68+34 To 0,DX,Y2
Wait 10 : Wait Vbl
Screen Copy 1,OX,34,OX+64,34+34 To 0,DX,Y2
'
Auto View Off : Unpack 13 To 2 : For N=0 To 31 : Colour N,0 : Next
Screen Display 2,164,100,, : Screen To Back : Screen Hide 3
Auto View On : Wait Vbl
Screen 0 : Fade 1 : Wait 16
Screen 2 : Screen To Front : Fade 1 To 1
KWAIT
Fade 1 : Wait 16 : Screen To Back
Screen 0 : Fade 1 To 1 : Wait 16 : Screen Show 3
Screen Close 2
Wait Vbl : Screen Copy 1,OX,34,OX+64,34+34 To 0,DX,Y2
Return
Z7: OX=128 : DX=240 : Gosub CB
_SETUP_MENU : Return
'
' Animates the clickable buttons
CB:
Wait Vbl
Screen Copy 1,OX,68,OX+64,68+34 To 0,DX,Y2
Wait 10 : Wait Vbl
Screen Copy 1,OX,34,OX+64,34+34 To 0,DX,Y2
Return
'
' Animates the drop buttons
ZZ:
Screen 1 : Get Bob 9,OX,0 To OX+63,33 : No Mask 9 : Screen 0
Set Bob 2,-1,, : Bob 2,DX,Y1-32,9 : Limit Bob 2,0,Y1 To 320,Y1+32 : Update
Channel 2 To Bob 2
Amal 2,"Move 0,32,8; Move 0,-4,4; Move 0,4,4;"
Amal On : While Chanmv(2) : Wait Vbl : Wend
Bob Off : Del Bob 9
Update
Return
End Proc
Procedure _THEEND
If DPATH$=PRAM$
_GETFLAG[6]
If Param=0
INFO[">>> Deleting compiler work folder from ram-disc <<<"]
_DELETE_FOLDER[PRAM$]
NOINFO : Wait 8
End If
End If
_GETFLAG[7] : If Param=0 : Extension_5_00A0 : End If
Fade 1 : Wait 16
Screen Close 3
Screen Close 1
Screen Close 0
Edit
End Proc
Procedure _DELETE_FOLDER[S$]
Dim FILE$(64),NC$(2)
On Error Proc _SKIP_DISC_ERROR
Resume Label _SKIP
'
Set Dir ,""
If Upper$(Left$(S$,4))<>"RAM:"
INFO[">>> Warning! I do not want to delete:"+S$+"! <<<"] : KWAIT
Else
'
A$=Dir First$(S$+"/**")
While A$<>""
FILE$(N)=Left$(A$,30)-" " : Inc N
A$=Dir Next$
Wend
If N
For C=0 To N-1
Kill S$+"/"+FILE$(C)
Next
End If
Kill S$
End If
'
_SKIP:
End Proc
Procedure _COPY_FOLDER[S$,D$]
Dim FILE$(64),NC$(5)
On Error Proc _FATAL_DISC_ERROR
'
INFO[">>> Copying AMOS_System folder onto ram-disc. <<<"]
NC$(0)="W.LIB"
NC$(1)="ACMP"
NC$(2)="AMOS1_2_PAL.ENV"
NC$(3)="AMOS1_2_NTSC.ENV"
NC$(4)="AMOS1_2.ENV"
NC$(5)="COMPILER_CONFIGURATION.LARGE"
NCOP=5
Set Dir ,""
A$=Dir First$(S$+"/**")
While A$<>""
B$=Left$(A$,30)-" "
Do
For NC=0 To NCOP
Exit If Upper$(B$)=NC$(NC),2
Next
FILE$(N)=B$
TL=TL+Val(Mid$(A$,30))
Inc N
Exit
Loop
A$=Dir Next$
Wend
If Chip Free+Fast Free<TL+100*1024
INFO[">>> Not enough free ram to copy libraries to the ram-disc. <<<"]
KWAIT
Goto _NORAM
End If
Mkdir D$
If N
For C=0 To N-1
A$=S$+"/"+FILE$(C) : B$=D$+"/"+FILE$(C)
I$=">>> Copying: "+FILE$(C)+" to ram-disc <<<" : INFO[I$]
_FCOPY[A$,B$]
Next
End If
F=-1
_NORAM:
NOINFO
Set Dir ,".info/*.info/*.*.info"
End Proc[F]
Procedure _FCOPY[S$,D$]
On Error Proc _FATAL_DISC_ERROR
Open In 1,S$
Open Out 2,D$
LF=Lof(1)
Do
Exit If P>=LF
L=Min(1024,LF-P)
A$=Input$(1,L)
Print #2,A$;
Add P,L
Loop
Close 1
Close 2
End Proc
Procedure _SET_ZONES
NZ=7
Reserve Zone NZ
' Set up zones
For Z=1 To NZ
Read A,B,C,D : Set Zone Z,A,B To C,D
Next
Data 16,48,79,80
Data 128,48,191,80
Data 240,48,303,80
Data 16,93,88,123
Data 16,134,79,166
Data 128,134,191,166
Data 240,134,303,166
End Proc
Procedure _UNPACK_ICONS
Auto View Off
Unpack 12 To 1 : Screen Hide 1
Auto View On : _MOUSE_PALETTE
Screen 0
End Proc
Procedure _UNPACK_FADE[BK,SC,SP]
Dim C(31)
Auto View Off
Unpack BK To SC : Screen Hide : _MOUSE_PALETTE : View : Wait Vbl
For N=0 To 31
C(N)=Colour(N) : Colour N,0
Next
Screen Show : View : Wait Vbl
Fade SP,C(0),C(1),C(2),C(3),C(4),C(5),C(6),C(7),C(8),C(9),C(10),C(11),C(12),C(13),C(14),C(15),C(16),C(17),C(18),C(19)
Wait SP*16
_MOUSE_PALETTE
Auto View On
End Proc
Procedure _UNPACK_INFO
Auto View Off
Unpack 11 To 3 : Screen Hide
Screen Display 3,,228,, : View
_MOUSE_PALETTE : For N=0 To 15 : Colour N,0 : Next
Screen Show
Auto View On
End Proc
Procedure _MOUSE_PALETTE
For C=16 To 31
Colour C,0
Next
For C=16 To 24
Read CC
Colour C,CC
Next
Data $0,$FFF,$FD0,$F90,$FC8,$DA4,$C70,$940,$F00
End Proc
Procedure _MAKE_SETUP_SCREEN
Fade 1 : Wait 16
Auto View Off
Unpack 11 To 3 : Screen Hide 3 : _MOUSE_PALETTE
Screen Open 1,640,200,8,Hires
Curs Off : Flash Off : For C=0 To 31 : Colour C,0 : Next
Screen Copy 3,0,0,640,8 To 1,0,0
For Y=8 To 192 Step 8
Screen Copy 3,0,9,640,9+8 To 1,0,Y
Next
Screen Copy 3,0,21-8,640,21 To 1,0,192
Auto View On
Fade 1 To 3
_UNPACK_INFO
Screen To Back 3
Screen 1
End Proc
Procedure _SETUP_MENU
Dim JMP$(64),ZIT(64),ITZ(64),ZBASE(64)
_MAKE_SETUP_SCREEN
Paper 6 : Pen 7 : Ink 5
PAGE=1
' Handle menu
MK_MENU:
Curs Off : Gosub DR_MENU
NOZ=1
Do
Repeat
Multi Wait
Z=Mouse Zone : K=Mouse Key
If Z<>OLDZ
If OLDZ>0 : ACT=-1 : IT=ZIT(OLDZ) : OLDZ=-1 : Gosub DR_ITEM : End If
If Z>0 : OLDZ=Z : ACT=Z : IT=ZIT(Z) : ZNE=ZBASE(IT) : Gosub DR_ITEM : End If
End If
Until Z<>0 and K<>0
If JMP$(Z)<>"" : Gosub JMP$(Z) : End If
ACT=Z : ZNE=ZBASE(IT) : Gosub DR_ITEM
If K=1 : Repeat : Multi Wait : Until Mouse Key=0 : End If
Loop
'
MN_BACK:
Pop
Fade 1 : Wait 16
_UNPACK_ICONS
Screen 0 : Fade 1 To 1
Pop Proc
'
MN_SAVE:
Timer=0
INFO[">>> Saving configuration file <<<"]
Wait 8 : Screen To Front 3 : Wait 8
_SAVE_CONFIGURATION
Repeat : Until Timer>50
Screen To Back 3
NOINFO
Screen 1
Return
'
ST_FLAG: V=1-V : Gosub "POK"+VTYPE$ : Return
' Draw menu page
DR_MENU:
Reserve Zone 64
IT=0 : ZNE=1 : NOZ=0 : ACT=-1 : OLDPAR=-1
Repeat
Inc IT : ZBASE(IT)=ZNE : Gosub DR_ITEM
Until FLAG=False
Return
' Draw one menu item
DR_ITEM:
LAB$="L"+(Str$(PAGE)-" ")+"_"+(Str$(IT)-" ")
On Error Goto NO_IT
Restore LAB$ : Read IT$
On Error
M=0 : XX=-1
Repeat
NEND=Instr(IT$,"|",M+1)
ENC=0 : LBL$="" : FL=0 : ZZ=0 : NB=0
Repeat
N=M+1
M=Instr(IT$,",",N) : M2=Instr(IT$,":",N) : If M>M2 : M=0 : End If
If M=0 or(NEND<>0 and M1>NEND) : M=M2 : FL=1 : End If
A$=Upper$(Mid$(IT$,N,1)) : Inc N
If A$="E" : ENC=1 : End If
If A$="L" : Gosub GT_STR : LBL$=A$ : Inc ZZ : End If
If A$="C" : CNT=1 : End If
If A$="X" : Gosub GT_STR : XX=Val(A$) : End If
If A$="Y" : Gosub GT_STR : YY=Val(A$) : End If
Until FL
If NEND
A$=Mid$(IT$,M+1,NEND-M-1)
Else
A$=Mid$(IT$,M+1)
End If
Gosub DR_WORD
M=NEND
Until NEND=0
FLAG=True
Return
'
DR_WORD:
If XX<0 : XX=40-Len(A$)/2 : End If
Locate XX,YY
'
FST=0
If Left$(A$,1)="&"
Inc FST
B$=Upper$(Mid$(A$,2,1)) : A$=Mid$(A$,3)
If B$="F"
Gosub GT_VAL
A$=" No " : If V : A$=" Yes " : End If
End If
End If
'
X1=X Graphic(XX)-3 : Y1=Y Graphic(YY)-2 : X2=X Graphic(XX+Len(A$))+2 : Y2=Y1+11
'
If ZZ<>0 or NOZ=0 or FST<>0
Inverse Off : If ZZ<>0 and ACT=ZNE : Inverse On : End If
Print A$;
If ENC<>0 and NOZ=0 : Box X1,Y1 To X2,Y2 : End If
End If
If ZZ<>0
If NOZ=0
Set Zone ZNE,X1,Y1 To X2,Y2
ZIT(ZNE)=IT : ITZ(IT)=ZNE
If LBL$<>""
JMP$(ZNE)=LBL$
End If
End If
Inc ZNE
End If
XX=XX+(X2-X1)/8+1
Return
'
NO_IT: Resume NO_IT2
NO_IT2: FLAG=False
Return
'
GT_STR:
A$=Mid$(IT$,N,M-N)
Return
'
GT_VAL:
VTYPE$=Left$(A$,1) : ADV=Val(Mid$(A$,2))
Goto "PIK"+VTYPE$
PIKF: _GETFLAG[ADV] : V=Param : Return
POKF: _SETFLAG[ADV,V] : Return
'
' Datas page 1
L1_1: Data "C,Y1,E: Compiled program setup "
L1_2: Data "Y3,X6:- Include error messages?|X66,E,LSt_Flag:&FF09"
L1_3: Data "Y5,X6:- Create default screen?|X66,E,LSt_Flag:&FF10"
L1_4: Data "Y7,X6:- Send AMOS TO BACK upon booting?|X66,E,LSt_Flag:&FF08"
L1_5: Data "Y9,X6:- CLI programs to run in the background?|X66,E,LSt_Flag:&FF04"
L1_6: Data "Y11,X6:- Long forward jumps (option -L for VERY long programs)?|X66,E,LSt_Flag:&FF12"
L1_7: Data "C,Y13,E: Compiler setup "
L1_8: Data "Y15,X6:- Copy all libraries onto ram-disc?|X66,E,LSt_Flag:&FF05"
L1_9: Data "Y17,X6:- Leave libraries on ram-disc upon exiting?|X66,E,LSt_Flag:&FF06"
L1_10: Data 'Y19,X6:- Keep compiler program "ACmp" in memory upon exiting?|X66,E,LSt_Flag:&FF07'
L1_11: Data "Y21,X6:- Squash compiled program?|X66,E,LSt_Flag:&FF11"
L1_12: Data "E,X72,Y23,LMn_Back: Exit "
L1_13: Data "E,X45,Y23,LMn_Save: Save this configuration "
End Proc
Procedure _SQUASH_A_PROG[S$,D$,FIRST]
'
On Error Proc _GENERAL_DISC_ERROR
Resume Label SQERROR
'
Open In 1,S$
Open Out 2,D$
'
HEAD1$=Input$(1,12)
NHUNK=Leek(Varptr(HEAD1$)+8)
HEAD2$=Input$(1,4*(2+NHUNK))
'
Print #2,HEAD1$;
Print #2,HEAD2$;
'
For H=0 To NHUNK-1
FLAG=True : If FIRST<>0 and H=0 and NHUNK>1 : FLAG=0 : End If
Gosub SQHUNK
Exit If BRK
Loke Varptr(HEAD2$)+4*(2+H),HH
Next
'
If BRK=0
Pof(2)=12
Print #2,HEAD2$;
LPROG=Lof(2)
Close
Else
Close
Kill D$
LPROG=0
End If
Goto SQEND
'
SQERROR:
On Error Proc _SKIP_DISC_ERROR
Resume Label KK
Kill D$
KK: LPROG=-1
Goto SQEND
'
SQHUNK:
H$=Input$(1,8) : Pof(1)=Pof(1)-8
HH=Leek(Varptr(H$)) and $C0000000
LP=Leek(Varptr(H$)+4) : HH=HH or LP : Rol.l 2,LP
Add LP,8+4
F=0
'
Erase 8 : Reserve As Work 8,LP+16
'
OLDPOF=Pof(1)
'
_ONCE_AGAIN:
AP=Start(8) : P=0
Repeat
L=2048 : If P+L>LP : L=LP-P : End If
A$=Input$(1,L)
Copy Varptr(A$),Varptr(A$)+L To AP
Add P,L : Add AP,L
Until P>=LP
'
AP=Start(8)
'
If FLAG<>0 and F=0
If Leek(AP)<>$78566467
'
L= Extension_5_00CE(AP+8,LP-12,-1,512,17)
If L=-1
Pof(1)=OLDPOF : F=-1 : Goto _ONCE_AGAIN
End If
If L=-2 : BRK=-1 : Goto _ABORT : End If
'
LH=(L+3) and $FFFFFFFC
Copy AP+8,AP+8+LH To AP+8+12
Loke AP+8,$78566467 : Loke AP+12,LP : Loke AP+16,L
Add LH,12 : Loke AP+4,LH/4
HH=(HH and $C0000000) or(LH/4)
Loke AP+8+LH,$3F2
LP=8+LH+4
End If
End If
'
A$=Space$(2048) : P=0
Repeat
L=2048 : If P+L>LP : L=LP-P : End If
Copy AP,AP+L To Varptr(A$)
Print #2,Left$(A$,L);
Add P,L : Add AP,L
Until P>=LP
'
_ABORT:
Erase 8
Return
'
SQEND:
End Proc[LPROG]
Procedure INFO[A$]
Screen 3
Ink 6 : Bar 6,4 To Screen Width-8,Screen Height-4
Ink 7,6 : L=Text Length(A$) : Text 320-L/2,12,A$
_MOUSE_PALETTE : Fade 1,$0,$F00,$E60,$DA0,$DA0,$DD0,$C,$EEE : Wait 8
Screen 0
End Proc
Procedure NOINFO
Screen 3 : Fade 1,0,0,0,0,0,0,0,0 : Wait 8 : Screen 0
End Proc
Procedure KWAIT
Bell
Update On : Hide On
Repeat
Sprite 8,X Mouse,Y Mouse,8
Multi Wait
Until Mouse Key
While Mouse Key : Wend
Sprite Off : Wait Vbl
Show On
End Proc